﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

namespace Pittypat.Web
{
    /// <summary>
    /// 向客户端响应一个 <see cref="ByteArray"/> 对象。
    /// </summary>
    sealed class ByteArrayMessage : Message
    {
        private ByteArray value;

        /// <summary>
        /// 使用要响应的 <see cref="ByteArray"/> 初始化 <see cref="ByteArrayMessage"/> 类的新实例。
        /// </summary>
        /// <param name="value">要发送的 <see cref="ByteArray"/>。可以为 null，此时不会发送任何数据。</param>
        internal ByteArrayMessage(ByteArray value)
        {
            this.value = value;
        }

        /// <summary>
        /// 将当前对象作为 JSON 字符串写入指定的文本流。
        /// </summary>
        /// <param name="writer">目标文本流。</param>
        /// <exception cref="global::System.ArgumentNullException">writer 是 null。</exception>
        public override void Write(TextWriter writer)
        {
            if (this.value != null)
            {
                ((IJson)this.value).Write(writer);
            }
        }

        /// <summary>
        /// 通过 WebSocket 发送消息。
        /// </summary>
        /// <param name="progress">异步进度。</param>
        /// <param name="bufferSize">缓冲区的大小。</param>
        /// <returns>异步任务。</returns>
        internal override Task SendAsync(WebSocketAsyncProgress progress, int bufferSize = 0)
        {
            if (this.value != null)
            {
                return this.value.SendAsync(progress, bufferSize);
            }

            return Task.FromResult((object)null);
        }

        /// <summary>
        /// 将文件作为响应内容附加到指定的响应消息。
        /// </summary>
        /// <param name="response">目标响应。</param>
        internal override void ToResponseContent(HttpResponseMessage response)
        {
            if (this.value != null)
            {
                this.value.ToResponseContent(response);
            }
        }
    }
}
